<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Generator 函数</title>
</head>

<body>
  <script src="./js/ajax.js"></script>
  <script>

    // 在function 右边， 函数名称左边加一个* 号，表示声明一个Generator 函数.
    /*   function* say() {
        console.log('这是一个Generator 函数：');
        console.log("222");
        console.log("333");
  
      }
      let obj = say() // Generator 函数调用后，返回一个对象
      // console.log(obj);  // say {}
      // 通过next(),执行这个函数里面的代码
      console.log(obj.next()); //输出'这是一个Generator 函数：'，返回{value: undefined, done: true}，表示 对象遍历已经结束了。
   */
    /*  function* sayWrod() {
       // console.log("hello");
       yield 'h1'
       yield 'h2'
       yield 'h3'
       yield 'h4'
     }
     let text = sayWrod();  // Generatror 对象
     // let state = text.next() // 第一次执行next时，会执行第一个yield 之前的所有代码，并且返回第一个yield表达式的值。
     // console.log(state); // {value: 'h1', done: false}  返回 yield 表达式生成的值
     // state = text.next()
     // console.log(state) //{value: 'h2', done: false}
     // state = text.next()
     // console.log(state) //{value: 'h3', done: false}
     // state = text.next()
     // console.log(state) //{value: 'h4', done: false}
     // state = text.next()
     // console.log(state) //{value: undefined, done: true}
 
     // 可以直接遍历 Generatror 对象
     for (const v of text) {
       console.log(v); // h1, h2, h3,h4
     }
 
  */

    function* dataConsumer() {
      console.log("0. started");
      console.log(`1. ${yield}`);// 第1个next()
      console.log(`2. ${yield}`);// 第2个next()
      return 'result' // 第3个next()

    }

    let obj = dataConsumer();
    let state = obj.next() // 0. started
    console.log(state); //{value: undefined, done: false}
    state = obj.next("第1个yield的值"); // next()里面的参数，实际上是给上一个yield表达式做结果使用的。
    // console.log(state); //{value: undefined, done: false}

    // state = obj.next("第2个yield的值")
    // console.log(state); //{value: 'result', done: true}

    // state = obj.next()
    // console.log(state); //{value: undefined, done: true}


    function* ajaxInterface() {

      yield ajax({
        url: "http://127.0.0.1:80/user/login",
        type: 'POST',
        data: { username: 'wenqingwu', password: '123456' },
        success: (resData) => {
          console.log(resData);
        },
        dataType: 'json'
      })
      yield ajax({
        url: "http://127.0.0.1:80/user/login",
        type: 'POST',
        data: { username: 'wenqingwu', password: '123456' },
        success: (resData) => {
          console.log(resData);
        },
        dataType: 'json'
      })
      // yield ajax()
      // yield ajax()
      // yield ajax()
      // yield ajax()
    }

    let apiObj = ajaxInterface();
    while (true) {
      state = apiObj.next()
      console.log(state);
      if (state.done) break;
    }
    // state = apiObj.next()
    // console.log(state);
    // state = apiObj.next()
    // console.log(state);

    // Promise.all([p1,p2,p3],function(){})
  </script>
</body>

</html>